package com.luoran.bartalks.service.impl;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSONObject;
import com.luoran.bartalks.dao.IBtCodingRuleDao;
import com.luoran.bartalks.entity.BaseInfo;
import com.luoran.bartalks.entity.biz.BtCodingRule;
import com.luoran.bartalks.service.IBtCodingRuleService;
import com.luoran.bartalks.utils.EnumBillType;

@Service
public class BtCodingRuleService implements IBtCodingRuleService {

	@Autowired
	private IBtCodingRuleDao codingRuleDao;

	@Override
	public PageQuery<? extends BaseInfo> getQueryList(PageQuery<? extends BaseInfo> pageQuery) {
		codingRuleDao.queryPage(pageQuery);
		return pageQuery;
	}

	// 插入一条数据
	@Override
	public String addCodingRule(BtCodingRule codingRule) {
		codingRuleDao.insertTemplate(codingRule);

		return codingRule.getId();
	}

	// 通过id查询对象
	@Override
	public BtCodingRule getCodingRule(String id) {

		return codingRuleDao.single(id);
	}

	/**
	 * 编码生成规则
	 * 
	 * 同一单据类型的编码规则只会有一个是处于启用状态 ..可以通过单据类型查询启用状态的编码规则.拿到BtCodingRule codingRule
	 * 前缀：勾选则代表启用，那么生成的编码则会以设置的前缀生效。 日期：勾选则代表启用，以选择的不同的模式在不同的日期产生不同的编码
	 * 序列：勾选则代表启用，序列长度：5，起步值：0，步长：1，那么第一、二、三次的值分别是 00001、00002、00003
	 * 后缀：勾选则代表启用，那么生成的编码则会以设置的后缀生效。
	 * 
	 */

	@Override
	public JSONObject generateCoding(EnumBillType enumBillType, String companyId) {
		JSONObject obj = new JSONObject();
		// 通过传过来的单据类型获取唯一启用的编码规则
		// 获得单据类型名称
		String billType = enumBillType.getName();

		// 根据单据类型名称以及公司ID查询编码规则
		BtCodingRule codingRule = codingRuleDao.findCodingRule(billType, companyId);
		if (StringUtils.isEmpty(codingRule)) {
			obj.put("flag", false);
			obj.put("msg", "未找到相应单据已启用的编码规则,请先添加或启用!");
			return obj;
		}
		// 用于拼接生成的编码
		StringBuffer generateCoding = new StringBuffer();

		// 判断启用的规则是否有前缀
		if (!StringUtils.isEmpty(codingRule.getCodingPrefix())) {
			generateCoding.append(codingRule.getCodingPrefix());
		}
		// 是否有日期格式
		if (!StringUtils.isEmpty(codingRule.getDateTime())) {
			// 年月日
			// 年/月/日
			// 年-月-日
			if ("yyyyMMdd".equals(codingRule.getDateTime())) {
				SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
				Date now = new Date();
				generateCoding.append(format.format(now));
			}
			if ("yyyy-MM-dd".equals(codingRule.getDateTime())) {
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
				Date now = new Date();
				generateCoding.append(format.format(now));
			}
			if ("yyyy/MM/dd".equals(codingRule.getDateTime())) {
				SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd/HH/mm/ss");
				Date now = new Date();
				generateCoding.append(format.format(now));
			}
		}
		// 是否有序列
		if (!StringUtils.isEmpty(codingRule.getSequenceLength())) {
			// 序列长度
			int sequenceLength = codingRule.getSequenceLength();
			// 序列起步值
			int sequenceBeginValue = codingRule.getSequenceBeginValue();
			// 步长
			int stepLengthValue = codingRule.getStepLengthValue();

			// 把序列的长度转换成"0"占位
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < sequenceLength; i++) {
				sb.append("0");
			}
			// 起步值+步长
			// 获取当前序列值
			int sequenceValue;
			// 当当前序列值为null的时候赋值为起步值.
			if (StringUtils.isEmpty(codingRule.getSequenceValue())) {
				sequenceValue = sequenceBeginValue;
			} else {
				sequenceValue = codingRule.getSequenceValue();
			}
			// 序列值数值=步长+当前序列值
			int squenceNum = stepLengthValue + sequenceValue;
			// 格式转换成000001
			DecimalFormat format = new DecimalFormat(sb.toString());
			String squence = format.format(squenceNum);

			generateCoding.append(squence);

			// 将生成的序列值存起来.
			codingRule.setSequenceValue(squenceNum);
			codingRuleDao.updateTemplateById(codingRule);

		}
		// 是否有后缀
		if (!StringUtils.isEmpty(codingRule.getCodingSuffix())) {
			generateCoding.append(codingRule.getCodingSuffix());
		}

		obj.put("flag", true);
		obj.put("msg", generateCoding.toString());
		return obj;

	}

	// 停用查询到的已启用的那条规则
	@Override
	public void closeStartedRule(String billType, String companyId) {
		codingRuleDao.closeStartedRule(billType, companyId);

	}

	// 根据id 启用停用
	@Override
	public int updateCodingRule(BtCodingRule codingRule) {
		int count = codingRuleDao.updateTemplateById(codingRule);
		return count;
	}

	// 根据id 更新. 没有值更新为null
	@Override
	public int editCodingRule(BtCodingRule codingRule) {
		int count = codingRuleDao.updateById(codingRule);
		return count;
	}

	// 查询启用规则的条数
	@Override
	public List<BtCodingRule> checkCodingRule(String billType, String companyId) {

		return codingRuleDao.getCodingRule(billType, companyId);
	}

	// 清空编码规则
	@Override
	public void deleteRulesByCompanyId(String companyId) {
		codingRuleDao.deleteRulesByCompanyId(companyId);

	}

	@Override
	public List<BtCodingRule> getcodingRuleStencilList(String companyId) {
		return codingRuleDao.getcodingRuleStencilList(companyId);
	}

	@Override
	public List<BtCodingRule> getAllByCompanyId(String companyId) {
		return codingRuleDao.getAllByCompanyId(companyId);
	}

	@Transactional
	@Override
	public boolean smartCreate(List<BtCodingRule> insertList, List<BtCodingRule> updataList) {
		boolean res=true;
		if(insertList!=null&&insertList.size()!=0) {
			try {
				codingRuleDao.insertBatch(insertList);
			} catch (Exception e) {
				e.printStackTrace();
				res=false;
				throw new RuntimeException("批量插入编码规则失败！");
			}
		}
		if(updataList!=null&&updataList.size()!=0) {
			try {
				codingRuleDao.getSQLManager().updateByIdBatch(updataList);
			} catch (Exception e) {
				e.printStackTrace();
				res=false;
				throw new RuntimeException("批量更新编码规则失败！");
			}
		}
		return res;
	}


}
